#include "../../include/command/ConcreteCommands.hpp"
#include "../../include/core/Executor.hpp"

// 移动指令：基础步数为1，加速状态下翻倍为2
void MoveCommand::execute(Executor& executor) {
    int steps = 1;
    if (executor.IsAccelerated()) {
        steps = 2;
    }
    executor.move(steps);
}

// 左转指令：加速状态下先移动1步（基础步数），再左转
void TurnLeftCommand::execute(Executor& executor) {
    if (executor.IsAccelerated()) {
        executor.move(1); // 加速时额外移动1步（基础步数，不翻倍）
    }
    executor.turnLeft();
}

// 右转指令：加速状态下先移动1步（基础步数），再右转
void TurnRightCommand::execute(Executor& executor) {
    if (executor.IsAccelerated()) {
        executor.move(1); // 加速时额外移动1步（基础步数，不翻倍）
    }
    executor.turnRight();
}

// 加速指令：切换加速状态
void FastCommand::execute(Executor& executor) {
    executor.isAccelerated = !executor.isAccelerated;
}

// 倒车指令：切换倒车状态
void ReverseCommand::execute(Executor& executor) {
    executor.isReversed = !executor.isReversed;
}

/**
 * @brief 掉头指令逻辑（根据测试用例反向推导）。
 * 
 * 非加速状态：向左侧移动1步，然后旋转180度。
 * 加速状态：向当前方向移动1步，再向左侧移动1步，然后旋转180度。
 * 
 * @param executor 执行器对象
 */
void TurnRoundCommand::execute(Executor& executor) {
    if (executor.isReversed) {
        return; // 倒车状态忽略掉头
    }

    // 保存原始朝向，用于判断左侧方向
    char originalHeading = executor.getCurrentState().heading;

    // --- 根据是否加速，执行不同的移动逻辑 ---
    
    // 1. 加速状态下：先向当前方向移动1步
    if (executor.IsAccelerated()) {
        executor.move(1);
    }

    // 2. 无论是否加速，都需要左转一次，然后向新的左侧方向移动
    executor.turnLeft();
    executor.move(1);

    // 3. 再次左转，完成180度掉头
    executor.turnLeft();
}